package iso8583

import (
	"encoding/hex"
	"fmt"
	"strings"
)

//Binary 二进制域解析
type Binary struct {
	Field
}

//NewBinary 创建数字字符域
func NewBinary(name int, typ int, len int) *Binary {
	//计算字节数据 根据文档 二进制使用的是位数 需要转化成字节
	size := len >> 3
	if len&((1<<3)-1) > 0 {
		size = size + 1
	}
	return &Binary{
		Field: Field{
			Name:   name,
			Type:   typ,
			Len:    size,
			PadMod: RightPad,
		},
	}
}

//Name 获取名称
func (bin *Binary) Name() int {
	return bin.Field.Name
}

//ValueString 真值
func (bin *Binary) ValueString() string {
	return bin.Field.DataStr
}

//Format 格式化域更具情况填充域值
func (bin *Binary) Format() []byte {
	return bin.Field.Data
}

//Parse 解析
func (bin *Binary) Parse(b []byte, pos *Position) string {
	//data := bin.Data;
	//计算字节数据 根据文档 二进制使用的是位数 需要转化成字节
	dist := make([]byte, bin.Len)
	copy(dist, b[pos.Get():pos.Get()+bin.Len])
	pos.Add(bin.Len)
	bin.Data = dist
	bin.DataStr = strings.ToUpper(hex.EncodeToString(bin.Data))
	fmt.Printf("binary:解析域（%d）完毕：%+v\n\t", bin.Field.Name, bin)
	return bin.DataStr
}
func init() {
	Register(52, NewBinary(52, FIX, 64))   //域 52 个人标识码数据  64bit的二进制数
	Register(96, NewBinary(96, FIX, 64))   //域 96 报文安全码  64bit的二进制数
	Register(128, NewBinary(128, FIX, 64)) //域 128 报文鉴别码，64bit二进制数

}
